home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / OBJCLCAL.C < prev    next >
C/C++ Source or Header  |  1992-03-21  |  3KB  |  91 lines

  1. /**************************************************************************
  2.  * OBJCLCAL.C - Calc clipping rectangle(s) for object in a tree.
  3.  *************************************************************************/
  4.  
  5. #include "gemfast.h"
  6. #ifndef NULL
  7.   #define NULL 0L
  8. #endif
  9.  
  10. int obj_clcalc(ptree, object, pgrect, pvrect)
  11.     register OBJECT *ptree;
  12.     int              object;
  13.     GRECT           *pgrect;
  14.     VRECT           *pvrect;
  15. {
  16.     int              adjust;
  17.     long             ob_spec;
  18.     int              ob_type;
  19.     int              ob_flags;
  20.     GRECT            workrect;
  21.  
  22.     obj_offxywh(ptree, object, &workrect);  /* get basic placement/sizes */
  23.  
  24.     ptree    = &ptree[object];              /* registerize/precalc some  */
  25.     ob_type  = ptree->ob_type & 0x00FF;     /* miscellanious things we   */
  26.     ob_flags = ptree->ob_flags;             /* us a lot below.           */
  27.     ob_spec  = ptree->ob_spec;
  28.  
  29.     if (ob_flags & INDIRECT) {              /* if INDIRECT flag is set,  */
  30.         ob_spec = *(long *)ob_spec;         /* go get the real ob_spec.  */
  31.     }
  32.  
  33.     if (ob_type == G_USERDEF) {
  34.         register XUSERBLK *pxub = (XUSERBLK *)ob_spec;
  35.         if (pxub->ub_self == pxub) {
  36.             ob_type = pxub->ob_type;
  37.             ob_spec = pxub->ob_spec;
  38.         }
  39.     }
  40.  
  41.     /*
  42.      * deal with objects that can have graphics that extend outside
  43.      * their ob_width/ob_height values...
  44.      */
  45.  
  46.     switch (ob_type) {
  47.       case G_BOXTEXT:
  48.       case G_FBOXTEXT:
  49.         adjust = ((TEDINFO*)ob_spec)->te_thickness;
  50.         break;
  51.       case G_BOX:
  52.       case G_IBOX:
  53.       case G_BOXCHAR:
  54.         adjust = (int)((char)(ob_spec >> 16));
  55.         break;
  56.       case G_BUTTON:
  57.         adjust = -1;
  58.         if (ob_flags & EXIT)
  59.             --adjust;
  60.         if (ob_flags & DEFAULT)
  61.             --adjust;
  62.         break;
  63.       default:
  64.         adjust = 0;
  65.         break;
  66.     }
  67.  
  68.     if (adjust > 0) {       /* if adjust value is positive, object has    */
  69.         adjust = 0;         /* "inner width" and no adjustment is needed. */
  70.     } else {                /* negative value implies outer width, invert */
  71.         adjust = -adjust;   /* it to a positive number for rc_gadjust().  */
  72.     }
  73.  
  74.     if (ptree->ob_state & (OUTLINED|SHADOWED)) { /* SHADOWED and OUTLINED */
  75.         adjust = 4;                              /* get fixed adjustment. */
  76.     }
  77.  
  78.     rc_gadjust(&workrect, adjust, adjust);       /* apply adjustment      */
  79.  
  80.     if (pgrect != NULL) {                        /* if caller wants GRECT,*/
  81.         *pgrect = workrect;                      /* copy results to it.   */
  82.     }
  83.  
  84.     if (pvrect != NULL) {                        /* if caller wants VRECT,*/
  85.         rc_gtov(&workrect, pvrect);              /* convert results to it.*/
  86.     }
  87.  
  88.     return adjust;
  89. }
  90.  
  91.